package test.test_7_15;
/*
用多线程代码来模拟，迅雷用3个线程下载100M资源的的过程。
(只需要在控制台打印已下载xx这句话即可,不需要真正的下载文件)
每个线程每次执行都下载1兆(M)资源，直到下载完毕，
即剩余的待下载资源大小为0
(用一个整数表示剩余资源量，一个线程每次执行会下载1兆(M),
下载完毕后该线程会打印剩余需要下载的资源)
参考售票的代码实现，这里需要考虑多线程的数据安全问题
注：仅模拟下载的过程，不是真的下载，也不是真的复制文件！
这道题目实际上就是多个线程共享访问一个num,然后修改num取值罢了
 */
public class Demo02 {
    public static void main(String[] args) {
        //创建Runnable对象表示下载任务
        DowmloadRunnable dowmloadRunnable = new DowmloadRunnable();

        //开启了3个线程，执行下载任务
        new Thread(dowmloadRunnable).start();
        new Thread(dowmloadRunnable).start();
        new Thread(dowmloadRunnable).start();

    }
}
class DowmloadRunnable implements Runnable {

    //待下载的100M资源

    int remaining = 100;

    private Object obj = new Object();

    /**
     * 在子线程中执行写在任务的实现代码
     */
    @Override
    public void run() {
        //模拟下载过程所需要的时间延迟
        while(remaining > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //模拟成功下载资源
            synchronized (obj) {
                if(remaining > 0) {
                    //注意因为这里是还剩下的资源，代码执行到这里，我们认为已经下载了
                    //1M了，所以输出的是：--remaining

                    System.out.println(Thread.currentThread().getName()+"下载了1M资源，还剩"+
                            --remaining+"M带下载资源");
                };

                if(remaining == 0) {
                    System.out.println("下载完毕");
                }
            }
        }

    }
}
